﻿/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __XOSKIT_XOS_CORE_XOS_STL_SRC_PROTOCOL_PKG_PKG_BASE_REQ_H__
#define __XOSKIT_XOS_CORE_XOS_STL_SRC_PROTOCOL_PKG_PKG_BASE_REQ_H__

#include "../../import/head.h"
#include "../../tools/head.h"
#include <string>

namespace xos_box
{
    class i_box_mgr;
}

namespace xos_protocol
{

    template< class CHILD, class REQUEST, class SESSION, class PACKAGE >
    class pkg_base_req
    {
    public:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 

        pkg_base_req( xos_box::i_serial * pSerial, xos_container::i_container * pContainer, int nProtocol ) :
            serial_ptr( pSerial ),
            container_ptr( pContainer ),
            n_protocol( nProtocol )
        {
        }

        ~pkg_base_req()
        {
        }

    public:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //

        xos_container::i_container * container_ptr;
        xos_box::i_serial * serial_ptr;
        int n_protocol;

    public:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //

        int dis_compose( int nProtocol, REQUEST * pRequest, SESSION * pSession, xos_box::i_buf * pBuf )
        {
            CHILD * pThis = static_cast<CHILD*>( this );
            int ret = 0;

            if( ( 0 == ret ) && ( n_protocol != nProtocol ) )
            {
                return 0;
            }

            if( 0 == ret )
            {
                pThis->helper_dis_compose( pRequest, pSession, pBuf );
            }

            if( 0 != ret )
            {
                pSession->post_close();
                pSession = 0;
            }

            return 1;
        }

        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //

        int compose( int nProtocol, REQUEST * pRequest, SESSION * pSession )
        {
            CHILD * pThis = static_cast<CHILD*>( this );
            int ret = 0;

            if( ( 0 == ret ) && ( n_protocol != nProtocol ) )
            {
                return 0;
            }

            xos_box::i_buf * pBuf = container_ptr->buf();

            if( 0 == ret )
            {
                pThis->helper_compose( pRequest, pBuf );
            }

            if( 0 == ret )
            {
                PACKAGE pkg;
                ret = pkg.post_package( pSession, pBuf );
                pBuf = 0;
            }

            if( 0 != ret )
            {
                pSession->post_close();
                pSession = 0;
            }

            xos_stl::release_interface( pBuf );

            return 1;
        }

        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //

        int proc( REQUEST * pRequest )
        {
            CHILD * pThis = static_cast<CHILD*>( this );
            int ret = 0;

            if( ( 0 == ret ) && ( n_protocol != pRequest->m_nProtocol ) )
            {
                return 0;
            }

            if( 0 == ret )
            {
                pThis->helper_proc( pRequest );
            }

            return 1;
        }

    public:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //

        int helper_dis_compose( REQUEST * pRequest, SESSION * pSession, xos_box::i_buf * pBuf )
        {
            int ret = 0;
            return ret;
        }

        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //

        int helper_compose( REQUEST * pRequest, xos_box::i_buf * pBuf )
        {
            int ret = 0;
            return ret;
        }

        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //

        int helper_proc( REQUEST * pRequest )
        {
            int ret = 0;
            return ret;
        }

    };

} // xos_protocol

#endif // __XOSKIT_XOS_CORE_XOS_STL_SRC_PROTOCOL_PKG_PKG_BASE_REQ_H__
